//*************************************************************************************
// File:     SwapSorter.cs
//*************************************************************************************
// Description: Encapsula una estructura para la reordenacion por intercambio de un
//              objeto derivado de System.Collections.IList
//*************************************************************************************
// Classes:      SwapSorter : ISorter
//*************************************************************************************
// Author:      http://www.codeproject.com/csharp/csquicksort.asp
//*************************************************************************************

using System;
using System.Collections;

namespace Xeralabs.Core.Utils.Internals
{
    /// <summary>
    /// Representa una estructura para la reordenacion por intercambio de un objeto derivado de System.Collections.IList
    /// </summary>
    public abstract class SwapSorter : ISorter
    {
        private IComparer comparer;
		private ISwap swapper;

        /// <summary>
        /// Constructor por defecto.
        /// </summary>
        public SwapSorter()
		{
			this.comparer = new ComparableComparer();
			this.swapper = new DefaultSwap();
        }
        /// <summary>
        /// Contructor.
        /// </summary>
        /// <param name="comparer">El comparador a emplear.</param>
        /// <param name="swapper">El intercambiador a emplear.</param>
        public SwapSorter(IComparer comparer, ISwap swapper)
		{
			if (comparer == null)
				throw new ArgumentNullException("comparer");
			if (swapper==null)
				throw new ArgumentNullException("swapper");

			this.comparer = comparer;
			this.swapper = swapper;
		}
        /// <summary>
        /// Devuelve o establece el comparador.
        /// </summary>
        public IComparer Comparer
		{
			get			
			{
				return this.comparer;
			}
			set
			{
				if (value==null)
					throw new ArgumentNullException("comparer");
				this.comparer = value;
			}
		}
        /// <summary>
        /// Devuelve o establece el intercambiador.
        /// </summary>
        public ISwap Swapper
		{
			get
			{
				return this.swapper;
			}
			set
			{
				if (value==null)
					throw new ArgumentNullException("swapper");
				this.swapper = value;
			}
		}

        /// <summary>
        /// Ordena los valores contenidos en <see cref="list"/> segun los criterios proporcionados por comparador e intercambiador.
        /// </summary>
        /// <param name="list">Un objeto derivado de System.Collections.IList que contiene los valores a ordenar.</param>
		public abstract void Sort(IList list);
	}
}
